package session

import (
	"context"
	"fmt"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"time"
)

type AccountInfo struct {
	gorm.Model
	Name     string `gorm:"not null;unique"`
	Password string `gorm:"not null;"`
	Status   uint   `gorm:"default:0"`
}

func TestSession(db *gorm.DB) {
	var users []AccountInfo
	/*GORM 提供了 Session 方法，这是一个 New Session Method，它允许创建带配置的新建会话模式：
	// Session 配置
	type Session viper_struct {
	 DryRun                 bool
	 PrepareStmt            bool
	 NewDB                  bool
	 SkipHooks              bool
	 SkipDefaultTransaction bool
	 AllowGlobalUpdate      bool
	 FullSaveAssociations   bool
	 Context                context.Context
	 Logger                 logger.Interface
	 NowFunc                func() time.Time
	}
	*/
	tx := db.Where("name like ?", "test%").Session(&gorm.Session{})
	for i := 0; i < 10; i++ {
		tx.Where("status != 0").Find(&users)
	}
	for _, user := range users {
		fmt.Println(user)
	}

	//跳过钩子
	/*如果您想跳过 钩子 方法，您可以使用 SkipHooks 会话模式，例如：
	DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)

	DB.Session(&gorm.Session{SkipHooks: true}).Create(&users)

	DB.Session(&gorm.Session{SkipHooks: true}).CreateInBatches(users, 100)

	DB.Session(&gorm.Session{SkipHooks: true}).Find(&user)

	DB.Session(&gorm.Session{SkipHooks: true}).Delete(&user)

	DB.Session(&gorm.Session{SkipHooks: true}).Model(User{}).Where("age > ?", 18).Updates(&user)
	*/
	db.Session(&gorm.Session{SkipHooks: true}).Create(&AccountInfo{
		Name:     "test_session_skip_hooks",
		Password: "12fc43ct@8",
		Status:   3,
	})

	timeoutCtx, fn := context.WithTimeout(context.Background(), time.Second)
	fn()
	tx = db.WithContext(timeoutCtx)
	tx.Find(&users)
	tx.Update("status", 1)

	//NowFunc 允许改变 GORM 获取当前时间的实现，例如：
	TestNowFunc(db)
}

func TestNowFunc(db *gorm.DB) {
	db.Session(&gorm.Session{
		NowFunc: func() time.Time {
			return time.Now().Local()
		},
	})
}

func TestDebug(db *gorm.DB) {
	db.Session(&gorm.Session{
		Logger: db.Logger.LogMode(logger.Info),
	})
}
